package com.iceclean.service;

import com.iceclean.po.*;

import java.util.List;

/**
 * @author : Ice'Clean
 * @date : 2021-05-04
 *
 * 与贴子有关的服务
 */
public interface PostService {

    /**
     * 通过贴子 id 寻找贴子
     * @param postId 贴子 id
     * @return 贴子实例对象
     */
    Post findPostById(int postId);

    /**
     * 通过页数寻找贴子（已删除的或正常的贴子）
     * @param postBarId 所属贴子
     * @param page 页数
     * @param num 每页的数目
     * @param postDelete 贴子的删除标识
     * @param sortClass 排序的种类
     * @param sortWay 排序的方式
     * @return 符合条件的贴子
     */
    List<Post> findPostsByPage(int postBarId, int page, int num, int postDelete, String sortClass, String sortWay);

    /**
     * 通过页数寻找指定用户发布的贴子
     * @param userId 所属用户
     * @param page 页数
     * @param num 每页的数目
     * @return 符合条件的贴子
     */
    List<Post> findUserPostsByPage(int userId, int page, int num);

    /**
     * 通过页数和搜索字段查询指定贴吧的贴子（模糊搜索）
     * @param postBarId 贴吧 id
     * @param search 搜索字段
     * @param page 页数
     * @param num 每页的数目
     * @param sortClass 排序的种类
     * @param sortWay 排序的方式
     * @return 符合条件的贴子集合
     */
    public List<Post> searchPostByPage(int postBarId, String search, int page, int num, String sortClass, String sortWay);

    /**
     * 获取搜索到的贴子总数
     * @param postBarId 贴吧 id
     * @param search 搜索字段
     * @return 以该字段在贴吧内搜索到的贴子总数
     */
    int getAllSearchForNumber(int postBarId, String search);

    /**
     * 获取贴吧内所有被删除的贴子的数量
     * @param postBarId 目标贴吧 id
     * @return 符合条件的贴子的数量
     */
    int getAllDeletePostForNumber(int postBarId);

    /**
     * 通过页数寻找指定用户的历史浏览对应的贴子对象
     * @param userId 所属用户
     * @param page 页数
     * @param num 每页的数目
     * @return 符合条件的贴子集合
     */
    List<Post> findBrowsingByPage(int userId, int page, int num);

    /**
     * 通过页数寻找指定用户收藏的贴子
     * @param userId 指定用户的 id
     * @param page 页数
     * @param num 每页的数目
     * @return 符合条件的贴子集合
     */
    List<Post> findPostCollectedByPage(int userId, int page, int num);

    /**
     * 通过页数查询指定贴子的回复
     * @param postId 指定的贴子 id
     * @param page 页数
     * @param num 每页的数量
     * @return 符合条件的回复集合
     */
    List<PostComment> findPostCommentByPage(int postId, int page, int num);

    /**
     * 这里传入了根回复 id，获取的是该回复的子回复
     * 按页数查询指定贴子、指定回复的子回复
     * @param postId 指定贴子 id
     * @param rootCommentId 指定的根回复 id
     * @param page 页数
     * @param num 每页的数量
     * @return 符合条件的回复
     */
    List<PostComment> findPostCommentByPage(int postId, int rootCommentId, int page, int num);

    /**
     * 获取指定用户历史浏览的总数
     * @param userId 指定的用户
     * @return 所有贴子数
     */
    int getNumberOfAllBrowsing(int userId);

    /**
     * 获取指定用户创建的所有贴吧的数目
     * @param userId 指定的用户 id
     * @return 所有贴吧数
     */
    int getNumberOfAllPostCollected(int userId);

    /**
     * 创建新贴子服务，通过贴子管理员 id 判断是否为公告帖
     * @param postBarId 新贴子所属贴吧 id
     * @param userId 新贴子发布者 id
     * @param postName 新贴子标题
     * @param postContent 新贴子内容
     * @param postAdminId 新贴子的管理员（吧主） id，若为 -1，表示不是公告帖
     * @return 新贴子（公告帖） id
     */
    int createPost(int postBarId, int userId, String postName, String postContent, int postAdminId);

    /**
     * 删除贴子
     * @param postId 贴子 id
     * @return 是否删除成功
     */
    boolean deletePost(int postId);

    /**
     * 恢复贴子
     * @param postId 贴子 id
     * @return 是否恢复成功
     */
    boolean recoverPost(int postId);

    /**
     * 创建新贴子回复服务
     * @param postId 新回复所属贴子 id
     * @param userId 新回复发布者 id
     * @param commentContent 新回复的内容
     * @return 新贴子回复对象
     */
    PostComment createPostComment(int postId, int userId, String commentContent);

    /**
     * 创建贴子回复的子回复服务（即回复的回复）
     * @param postId 新回复所属贴子 id
     * @param userId 新回复发布者 id
     * @param rootCommentId 新回复的根回复 id
     * @param commentContent 新回复的内容
     * @return 新贴子回复对象
     */
    PostComment createPostComment(int postId, int userId, int rootCommentId, String commentContent);

    /**
     * 删除贴子回复
     * @param postCommentId 贴子回复 id
     * @return 是否删除成功
     */
    boolean deletePostComment(int postCommentId);

    /**
     * 贴子增加浏览服务（贴子的浏览数 +1，浏览表记录增加）
     * @param postId 贴子 id
     * @param userId 用户 id
     * @return 浏览的实例对象
     */
    PostBrowsing addPostBrowsing(int postId, int userId);

    /**
     * 清空用户的历史浏览记录
     * @param userId 用户的 id
     * @return 是否删除成功
     */
    boolean deleteUserBrowsing(int userId);

    /**
     * 改变点赞状态（未点赞则新建点赞，已点赞则取消点赞）
     * @param postId 受处理的贴子 id
     * @param userId 处理的用户 id
     * @return 新点赞的实例对象，若为取消点赞则返回 null
     */
    PostLiked changePostLiked(Integer postId, Integer userId);

    /**
     * 判断用户是否点赞过
     * @param postId 贴子 id
     * @param userId 用户 id
     * @return 已点赞返回 true，否则 false
     */
    boolean isUserLiked(Integer postId, Integer userId);

    /**
     * 改变收藏状态（未收藏则新建收藏，已收藏则取消收藏）
     * @param postId 受处理的贴子 id
     * @param userId 处理的用户 id
     * @return 新收藏的实例对象，取消收藏则返回 null
     */
    PostCollected changePostCollected(Integer postId, Integer userId);

    /**
     * 判断用户是否收藏过
     * @param postId 贴子 id
     * @param userId 用户 id
     * @return 已收藏返回 true，否则 false
     */
    boolean isUserCollected(Integer postId, Integer userId);
}
